﻿using RuoVea.ExDto;
using RuoVea.ExEnum;
using RuoVea.ExSugar.Attributes;
using RuoVea.ExSugar.Entity;
using SqlSugar;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;

namespace RuoVea.OmiApi.Dict.Entitys;

/// <summary>
/// 字典类型表 - 存储系统字典类型定义，用于分类管理字典值数据
/// </summary>
[SugarTable(nameof(SysDictType))]
[Description("字典类型表 - 存储系统字典类型定义，用于分类管理字典值数据")]
[Tenant("0")]
[SugarIndex("index_{table}_N", nameof(Name), OrderByType.Asc)]
[SugarIndex("index_{table}_C", nameof(Code), OrderByType.Asc)]
public class SysDictType : EntityBase, ITenantEntity
{
    /// <summary>
    /// 租户Id
    /// </summary>
    [ConfigSugarTenantColumn("TenantId", "租户Id", false, true, false)]
    public long? TenantId { get; set; }
    /// <summary>
    /// 名称 - 字典类型的显示名称，用于界面展示
    /// 示例："用户状态", "订单类型", "首页大图"
    /// </summary>
    [ConfigSugarColumn(columnKey: nameof(Name), columnDescription: "名称 - 字典类型的显示名称，用于界面展示", Length = 256)]
    [Required, MaxLength(256)]
    public string Name { get; set; }

    /// <summary>
    /// 编码 - 字典类型的唯一编码标识，用于程序识别，全大写英文和下划线
    /// 示例："USER_STATUS", "ORDER_TYPE", "HOME_CAROUSEL"
    /// </summary>
    [ConfigSugarColumn(columnKey: nameof(Code), columnDescription: "编码 - 字典类型的唯一编码标识，用于程序识别", Length = 256)]
    [Required, MaxLength(256)]
    //[RegularExpression(@"^[A-Z][A-Z0-9_]*$", ErrorMessage = "编码格式不正确，必须全大写英文、数字和下划线，且以字母开头")]
    public string Code { get; set; }

    /// <summary>
    /// 排序 - 显示顺序，数值越小越靠前，默认值：10
    /// </summary>
    [ConfigSugarColumn(columnKey: nameof(Sort), columnDescription: "排序 - 显示顺序，数值越小越靠前，默认值：10", IsNullable = true, DefaultValue = "10")]
    public int Sort { get; set; } = 10;

    /// <summary>
    /// 备注 - 字典类型的详细描述信息
    /// 示例："管理用户账号状态选项", "定义订单的各种类型"
    /// </summary>
    [ConfigSugarColumn(columnKey: nameof(Remark), columnDescription: "备注 - 字典类型的详细描述信息", IsNullable = true, ColumnDataType = StaticConfig.CodeFirst_BigString)]
    public string Remark { get; set; }

    /// <summary>
    /// 状态 - 控制字典类型是否启用
    /// YesOrNot.N: 正常(启用)，YesOrNot.Y: 停用(禁用)，默认值：YesOrNot.N
    /// 停用时，该类型下的所有字典值都将不可用
    /// </summary>
    [ConfigSugarColumn(columnKey: nameof(IsDisable), columnDescription: "状态 - 控制字典类型是否启用", IsNullable = true)]
    public YesOrNot? IsDisable { get; set; } = YesOrNot.N;

    /// <summary>
    /// 系统内置标识 - 标识是否为系统内置字典类型
    /// YesOrNot.Y: 系统内置(不可删除)，YesOrNot.N: 用户自定义(可删除)，默认值：YesOrNot.N
    /// 系统内置字典类型通常包含系统运行必需的基础数据
    /// </summary>
    [ConfigSugarColumn(columnKey: nameof(SysFlag), columnDescription: "系统内置标识 - 标识是否为系统内置字典类型", IsNullable = true)]
    public YesOrNot? SysFlag { get; set; }

    /// <summary>
    /// 字典值集合 - 导航属性，该字典类型下的所有字典值
    /// 一对多关系，通过TypeId字段关联SysDictValue表
    /// </summary>
    [Navigate(NavigateType.OneToMany, nameof(SysDictValue.TypeId))]
    public List<SysDictValue> Children { get; set; }
}